package com.yjzx.util.rabbit.config;

import com.yjzx.util.rabbit.constant.MqConst;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;

/**
 * 配置RabbitMQ的连接、队列、交换机和绑定关系。
 */
public class RabbitConfig {

    /**
     * 创建持久化的队列queue。
     *
     * @return Queue实例
     */
    @Bean
    public Queue lastingQueue() {

        return QueueBuilder.durable(MqConst.QUEUE_LASTING).build();
    }

    /**
     * 创建带有死信机制的队列queue_dlx。
     *
     * @return Queue实例
     */
    @Bean
    public Queue queueDLX() {

        return QueueBuilder.durable(MqConst.QUEUE_DLX)
                // 指定死信交换机
                .deadLetterExchange(MqConst.EXCHANGE_DLX)
                // 发送给死信交换机的routingkey
                .deadLetterRoutingKey("dlx.hehe")
                // 设置队列的最大长度为10
                .maxLength(10)
                // 设置消息过期时间为10000毫秒
                .ttl(10000).build();
    }



    /**
     * 创建直接交换机test_ex。
     *
     * @return DirectExchange实例
     */
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(MqConst.EX_LASTING, true, false);
    }



    /**
     * 创建主题交换机exchange_dlx。
     *
     * @return TopicExchange实例
     */
    @Bean
    public TopicExchange exchangeDLX() {
        return new TopicExchange(MqConst.EX_DLX, true, false);
    }

    /**
     * 创建test_queue到test_ex的绑定。
     *
     * @param testQueue          队列
     * @param testDirectExchange 交换机
     * @return Binding实例
     */
    @Bean
    public Binding testBinding(@Qualifier("lastingQueue") Queue testQueue,@Qualifier("directExchange") DirectExchange testDirectExchange) {
        return BindingBuilder.bind(testQueue).to(testDirectExchange).with("test");
    }


    /**
     * 创建queue_dlx到exchange_dlx的绑定。
     *
     * @param queueDLX    队列
     * @param exchangeDLX 交换机
     * @return Binding实例
     */
    @Bean
    public Binding dlxBinding(@Qualifier("queueDLX")Queue queueDLX,@Qualifier("exchangeDLX") TopicExchange exchangeDLX) {
        return BindingBuilder.bind(queueDLX).to(exchangeDLX).with("dlx.#");
    }

}
